<?php
/**
 * ページネータ生成ヘルパ
 *
 * @author tanaka
 * @package Controller_Action_Helper
 * @subpackage Paginator
 */
class Controller_Action_Helper_Paginator extends Zend_Controller_Action_Helper_Abstract
{
	/**
	 * ページパラメーターのキー
	 * @var string
	 */
	protected static $_defaultPageParamKey = 'page';

	/**
	 * デフォルトの1ページ辺りの件数
	 *
	 * @var int
	 */
	protected static $_defaultItemCountPerPage = 50;

	/**
	 * デフォルトページパラメーターのキーをセット
	 *
	 * @param string $key
	 * @throws Zend_Controller_Action_Exception
	 * @return void
	 */
	protected static function setDefaultPageParamKey($key)
	{
		if (!is_string($key) || strlen($key) == 0) {
			throw new Zend_Controller_Action_Exception('引数が不正');
		}

		self::$_defaultPageParamKey = $key;
	}

	/**
	 * デフォルトの1ページ辺りの件数をセット
	 *
	 * @param int $number
	 * @throws Zend_Controller_Action_Exception
	 * @return void
	 */
	protected static function setDefaultItemCountPerPage($number)
	{
		if (!ctype_digit("{$number}")) {
			throw new Zend_Controller_Action_Exception('引数が不正');
		}

		self::$_defaultItemCountPerPage = intval($number);
	}

	/**
	 * デフォルトページパラメーターのキーを取得
	 *
	 * @return string
	 */
	protected static function getDefaultPageParamKey()
	{
		return self::$_defaultPageParamKey;
	}

	/**
	 * デフォルトの1ページ辺りの件数を取得
	 *
	 * @return int
	 */
	protected static function getDefaultItemCountPerPage()
	{
		return self::$_defaultItemCountPerPage;
	}

	/**
	 * ページネータを取得
	 *
	 * @param Zend_Paginator_Adapter_Interface $adapter
	 * @param int optional $itemCountPerPage
	 * @param string optional $pageKey
	 * @return Zend_Paginator
	 */
	public function direct(Zend_Paginator_Adapter_Interface $adapter, $itemCountPerPage = null, $pageKey = null)
	{
		return $this->getPaginator($adapter, $itemCountPerPage, $pageKey);
	}

	/**
	 * ページネータを取得
	 *
	 * @param Zend_Paginator_Adapter_Interface $adapter
	 * @param int optional $itemCountPerPage
	 * @param string optional $pageKey
	 * @return Zend_Paginator
	 */
	public function getPaginator(Zend_Paginator_Adapter_Interface $adapter, $itemCountPerPage = null, $pageKey = null)
	{
		if (is_null($itemCountPerPage)) {
			$itemCountPerPage = self::$_defaultItemCountPerPage;
		}

		if (is_null($pageKey)) {
			$pageKey = self::$_defaultPageParamKey;
		}

		$currentPageNumber = $this->_actionController->getRequest()->getParam($pageKey);

		$paginator = new Zend_Paginator($adapter);
		return $paginator->setItemCountPerPage($itemCountPerPage)->setCurrentPageNumber($currentPageNumber);
	}
}
